iT邦幫忙

2024 iThome 鐵人賽

DAY 3
0

運算元(operands)和運算子(operators)是進行數學、邏輯或其他類型計算的基本元素,以下是他們的樣子,接下來就要依據他們的用途做各種分類說明!

運算子:對於變數和值進行運算的符號,如 +-*
運算元:被操作的對象,如數字、變量或表達式。

運算元和運算子

算術操作子、比較操作子、邏輯操作子


不同操作子的整理

條件陳述式(if, else, switch)


根據不同的條件陳述式執行不同的代碼,常見的條件陳述式有 ifelseswitch
簡單來說,一個流程判斷式,如果成立要做什麼事情,不成立又要做什麼事情,下圖是用 if...else if...else 畫成一個流程圖說明。
if 流程圖

if...else if...else 陳述式

  • 語法:
    if (condition1) {
      // 當 condition1 為 true 時執行的代碼
    } else if (condition2) {
      // 當 condition1 為 false 且 condition2 為 true 時執行的代碼
    } else {
      // 當所有條件都為 false 時執行的代碼
    }
    

🔔 如果是簡單的判斷條件,也就是非黑即白的那種,可以使用條件運算子(三元運算子)
condition ? expr1 : expr2 (true ? 'Yes' : 'No' 結果為 'Yes')

🔔 如果條件結果極有可能是 nullundefined,可以使用空值合并运算符(??)
leftExpr ?? rightExpr (左邊的值是 null 或者 undefined 就會返回右邊的值)

switch 陳述式

  • 語法:
    switch (expression) {
      case value1:
        // 當 expression 等於 value1 時執行的代碼
        break;
      case value2:
        // 當 expression 等於 value2 時執行的代碼
        break;
      default:
        // 當 expression 不等於任何 case 值時執行的代碼
    }
    

🔔 if...else 瀏覽器在渲染或編譯的時候,會全部跑一次,所以在編譯的速度和效能上,如果條件很多,會比 switch 效能差,因為 switch 只會檢視 case 有無符合,才會去跑程式碼,而不是裡面的東西都檢視過一次。

  • if...else if...else:一個範圍的時候,例如,介於某區間 ,大於小於多少。
  • switch:一個特定的明確 case 做比對時,尤其是處理大量的離散值時性能更好。

✍🏻 範例:codewars <6kyu> Who likes it?
Implement the function which takes an array containing the names of people that like an item. It must return the display text as shown in the examples:
中譯:實作一個函數,該函數接受一個包含喜歡某個項目的人的姓名的陣列。它必須返回顯示文本,如範例所示

[]                                -->  "no one likes this"
["Peter"]                         -->  "Peter likes this"
["Jacob", "Alex"]                 -->  "Jacob and Alex like this"
["Max", "John", "Mark"]           -->  "Max, John and Mark like this"
["Alex", "Jacob", "Mark", "Max"]  -->  "Alex, Jacob and 2 others like this"

My answer:
以下個別用條件陳述式編輯出符合需求的函式

function likes(names) {
  if (names.length === 0) return "no one likes this";
  else if (names.length === 1) return `${names[0]} likes this`;
  else if (names.length === 2) return `${names.join(" and ")} like this`;
  else if (names.length === 3) return `${names[0]}, ${names[1]} and ${names[2]} like this`;
  else return `${names[0]}, ${names[1]} and ${names.length - 2} others like this`;
}
function likes(names) {
  switch (names.length) {
    case 0:
      return "no one likes this";
    case 1:
      return `${names[0]} likes this`;
    case 2:
      return `${names.join(" and ")} like this`;
    case 3:
      return `${names[0]}, ${names[1]} and ${names[2]} like this`;
    default:
      return `${names[0]}, ${names[1]} and ${ names.length - 2 } others like this`;
  }
}

迴圈語句(for, while)


在 JavaScript 中,迴圈 loops 用於重複執行一段代碼,直到某個條件滿足為止。
常見的迴圈語句有以下這些,這裡因為實戰上只有用到 forwhile,所以會針對這 2 項分享。

  • for:多次循環一段代碼 -> 使用頻率算高,畢竟不是所有陣列都能使用 forEach
  • for...in:循環遍歷對象的屬性
  • for...of:循環遍歷可迭代對象的值
  • while:指定條件為真時循環代碼塊 -> 到目前為止只有在做 echart 的客製化需求用到過
  • do...while:當指定的條件為真時,還循環一段代碼

for
這個迴圈適合當知道要跑多少次時使用比較好,因為她是三個部分組成:

  1. 初始化:設定第一次迴圈變量。
  2. 條件:每次迴圈前檢查的條件,當條件為 true 時繼續執行,為 false 時停止。
  3. 更新:每次迴圈執行後進行的操作,通常用來更新迴圈變量。
  • 語法:
    for (initialization; condition; update) {
      // 每次迴圈執行的代碼
    }
    

✍🏻 範例:codewars <6kyu> Build Tower ☆☆☆
Build a pyramid-shaped tower, as an array/list of strings, given a positive integer number of floors. A tower block is represented with "*" character.
For example, a tower with 3 floors looks like this:
中譯:建構一座金字塔形塔,作為字串陣列/列表,給定正整數層數。塔樓以 "*" 字元表示。

[
    "  *  ",
    " *** ", 
    "*****"
]

And a tower with 6 floors looks like this:

[
    "     *     ", 
    "    ***    ", 
    "   *****   ", 
    "  *******  ", 
    " ********* ", 
    "***********"
]

My answer:
一開始的我看到這個題目,我只有想到用 2 個以上的迴圈把星星和空位喬出來,好不容易弄出來提交結果被測試說,結果可行但是花的時間太長會被拒絕通關,後來查到可以用單迴圈搭配 String.repeat() 就可以節省跑回圈的時間,才嘗試理解以下程式碼:

function towerBuilder(nFloors) {
  let tower = [];
  for (let i = 1; i <= nFloors; i++) {
    // 計算每層前導和後綴空格數量,假設有三層,第 3 層空格數 0;第 2 層的空格是 1
    let numSpaces = nFloors - i;
    
    // 計算每層星星數量,假設有三層,第 3 層有 5 顆星;第 2 層有 3 顆星
    let numStars = 2 * i - 1;

    // 組每層的字串(前導空格 + 星號 + 後綴空格)
    let floor = `${" ".repeat(numSpaces)}${"*".repeat(numStars)}${" ".repeat(numSpaces)}`;
    
    // 將這層添加到塔的數組中
    tower.push(floor);
  }
  return tower;
}

while
循環的目的是為了反复執行語句或代碼塊,只要指定條件為 true,循環就可以一直執行代碼塊,直到指定條件變成 false,跳出循環。

  • 語法:
    while (condition) {
      // 每次迴圈執行的代碼
    }
    

✍🏻 範例:
FizzBuzz 是一個簡單的小遊戲,給定一串從 1 到 100 的數字:

  • 如果是 3 的倍數,就印出 “Fizz”
  • 如果是 5 的倍數,就印出 “Buzz”
  • 如果同時是 3 和 5 的倍數,就印出 “FizzBuzz”
  • 將結果回傳為一個陣列。
// input 輸入
fizzBuzz100()

// output 輸出
["1","2","Fizz","4","Buzz","Fizz","7","8","Fizz","Buzz","11","Fizz","13","14","FizzBuzz"......後續省略]

My answer:

function fizzBuzz100() {
  let result = [];
  let count = 1;
  while (count <= 100) {
    // 同時是 3 和 5 的倍數
    if (count % 3 === 0 && count % 5 === 0) result.push("FizzBuzz");
    
    // 是 3 的倍數
    else if (count % 3 === 0) result.push("Fizz");
    
    // 是 5 的倍數
    else if (count % 5 === 0) result.push("Buzz");
    
    // 不是 3 和 5 的倍數,轉為字串添加到結果中
    else result.push(count.toString());
    
    // 計數器增加 1
    count++;
  }
  return result;
}

上一篇
第 2 天:基本語法和資料類型
下一篇
第 4 天:函式 function
系列文
30天 JavaScript 提升計畫:從零到精通結合2024年的創新功能30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言